/*
 * @lc app=leetcode.cn id=59 lang=cpp
 *
 * [59] 螺旋矩阵 II
 */

// @lc code=start
class Solution
{
public:
    vector<vector<int>> generateMatrix(int n)
    {
        //这道题没有用什么方法 主要就是看区间和判断 比较复杂
        //左开右闭 从左往右 从上到下 从右往左 从下到上
        vector<vector<int>> res(n, vector<int>(n, 0));
        int count = 1;  //计数
        int startx = 0; //每一圈起始位置
        int starty = 0;
        int mid = n / 2;  //主要是处理中间的位置 如果n为奇数 中间多了一个元素
        int loop = n / 2; //需要旋转几圈
        int offset = 1;   //控制每次遍历长度
        int i, j;
        while (loop--)
        {
            i = startx;
            j = starty;
            //  上 从左往后
            for (j = starty; j < n + starty - offset; j++)
            {
                //实际控制从startx,starty开始 遍历长度为n-offset
                res[i][j] = count++;
            }
            // 右  从上往下
            for (i = startx; i < n + startx - offset; i++)
            {
                //实际控制从startx,starty开始 遍历长度为n-offset
                res[i][j] = count++;
            }
            //下  从右往左
            for (; j > starty; j--)
            {
                //实际控制从startx,starty开始 遍历长度为n-offset
                res[i][j] = count++;
            }
            //下  从右往左
            for (; i > startx; i--)
            {
                //实际控制从startx,starty开始 遍历长度为n-offset
                res[i][j] = count++;
            }
            startx++;
            starty++;
            offset += 2;
        }
        if (n % 2)
        {
            res[mid][mid] = count;
        }
        return res;
    }
};
// @lc code=end
